# summary_memory_demo.py
import os
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationSummaryMemory, ConversationSummaryBufferMemory
from langchain.chains import ConversationChain


def summary_memory_demo():
    """ConversationSummaryMemory演示"""

    print("📝 ConversationSummaryMemory演示")
    print("=" * 40)

    llm = ChatOpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        model="qwen-turbo"
    )

    # 1. 基础摘要记忆
    print("1️⃣ 基础摘要记忆：")

    summary_memory = ConversationSummaryMemory(llm=llm)
    conversation = ConversationChain(
        llm=llm,
        memory=summary_memory,
        verbose=False
    )

    # 长对话内容
    detailed_conversation = [
        "你好，我叫王明，是一名资深Java开发工程师，有8年的开发经验",
        "我主要专精于微服务架构设计，熟练使用Spring Boot、Spring Cloud全家桶",
        "在阿里巴巴工作4年，负责核心交易系统的架构设计和团队管理",
        "我带过15人的技术团队，有丰富的项目管理和技术决策经验",
        "目前年薪45万，期望能找到更有挑战性的技术专家或架构师职位",
        "我对人工智能和大数据方向很感兴趣，希望能结合这些新技术"
    ]

    for i, user_input in enumerate(detailed_conversation, 1):
        print(f"\n第{i}轮对话：")
        print(f"用户：{user_input}")

        response = conversation.predict(input=user_input)
        print(f"AI：{response[:100]}...")

        # 显示当前摘要
        memory_vars = summary_memory.load_memory_variables({})
        print(f"📋 当前摘要：{memory_vars.get('history', '')[:150]}...")

    # 2. 摘要缓冲记忆（结合摘要和缓冲）
    print("\n2️⃣ 摘要缓冲记忆：")

    summary_buffer_memory = ConversationSummaryBufferMemory(
        llm=llm,
        max_token_limit=500  # 超过500个token时进行摘要
    )

    buffer_conversation = ConversationChain(
        llm=llm,
        memory=summary_buffer_memory,
        verbose=False
    )

    # 继续对话，测试摘要缓冲功能
    additional_conversation = [
        "请根据我的背景推荐3个最适合的职位",
        "我比较关心公司的技术氛围和发展前景",
        "薪资方面希望能有20%以上的提升",
        "工作地点最好在北京或深圳"
    ]

    for user_input in additional_conversation:
        response = buffer_conversation.predict(input=user_input)
        print(f"用户：{user_input}")
        print(f"AI：{response[:100]}...")

        # 显示记忆状态
        memory_vars = summary_buffer_memory.load_memory_variables({})
        print(f"📝 记忆状态：{str(memory_vars)[:150]}...")
        print()

    # 3. 手动创建摘要
    print("3️⃣ 手动摘要创建：")

    manual_summary_memory = ConversationSummaryMemory(llm=llm)

    # 手动添加对话历史
    conversations = [
        ("张工程师介绍了自己的基本情况：5年Java经验，熟悉Spring Boot",
         "HR表示感兴趣，询问了具体的项目经验"),
        ("张工程师详细介绍了在腾讯的项目经历，主要负责支付系统开发",
         "HR对其技术能力表示认可，询问期望薪资"),
        ("张工程师表示目前年薪25万，希望能有30万以上的机会",
         "HR表示可以安排技术面试，薪资待遇可以商议")
    ]

    for human_msg, ai_msg in conversations:
        manual_summary_memory.save_context(
            {"input": human_msg},
            {"output": ai_msg}
        )

    # 显示生成的摘要
    summary_vars = manual_summary_memory.load_memory_variables({})
    print(f"生成的摘要：{summary_vars['history']}")


# 运行演示
summary_memory_demo()
